home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / pd / serien / purity / nr.48 / brian / brian.p < prev    next >
Text File  |  1995-06-05  |  24KB  |  1,118 lines

  1. PROGRAM Brian;
  2.  
  3. {$I "Include:Intuition/IntuitionBase.i"}
  4. {$I "Include:Graphics/GfxBase.I" }
  5. {$I "Include:Graphics/Graphics.i"}
  6. {$I "Include:Graphics/Pens.i"}
  7. {$I "Include:Graphics/Text.I" }
  8. {$I "Include:Exec/Libraries.i"}
  9. {$I "Include:Exec/Memory.i"}
  10. {$I "Include:Exec/Exec.i" }
  11. {$I "include:utils/stringlib.i"}
  12. {$I "Include:libraries/Dosextens.i"}
  13. {$I "Include:libraries/Diskfont.I" }
  14. {$I "Include:Utils/Parameters.i"}
  15. {$I "Include:Utils/DieselReq.i"}
  16. {$I "Include:Utils/DOSUtils.I" }
  17. {$I "Include:Utils/IOUtils.I" }
  18. {$I "Include:Utils/CRT.I" }
  19. {$I "Include:Utils/ConsoleUtils.i" }
  20. {$I "Include:Utils/DeadKeyConvert.i" }
  21.  
  22. {$I "Include:Wurzelstuff/WurzelPP.i" }
  23.  
  24.  
  25. (*
  26.     Programmname    :   Brian               Version         :   0.10
  27.  
  28.     © 1995 by Andreas Neumann ; Brian ist FD, jeder darf es zu
  29.     nichtkommerziellen Zwecken verwenden - Verbreitung nur komplett
  30.     mit Anleitung erlaubt
  31.  
  32.     Veränderungen am Sourcecode für private Zwecke sind gestattet.
  33.     Eine Veröffentlichung der Veränderungen muß jedoch vorher mit mir
  34.     abgestimmt werden. See ya....
  35. *)
  36.  
  37.  
  38. CONST
  39.  
  40.     ESC_RAW         =   $45;
  41.     HOME_RAW        =   $3D;
  42.     END_RAW         =   $1D;
  43.     PGUP_RAW        =   $3F;
  44.     PGDN_RAW        =   $1F;
  45.     RETURN_RAW      =   $44;
  46.     ENTER_RAW       =   $43;
  47.  
  48.     GIMREL = GADGIMMEDIATE+RELVERIFY;
  49.  
  50.     MYMAXPOT    :   INTEGER =   $FFFF;
  51.     MYMAXBODY   :   INTEGER =   $FFFF;
  52.  
  53.     BRPropInfo  : PropInfo = (AUTOKNOB+FREEVERT+PROPBORDERLESS,0,0,0,0,0,0,0,0,0,0);
  54.  
  55.     BRControl03 :   Gadget = (NIL,0,0,0,0,gadghComp,
  56.                               GIMREL,propGadget,NIL,NIL,NIL,0,NIL,3,NIL);
  57.     BRControl02 :   Gadget = (NIL,0,0,0,0, gadghComp,
  58.                               GIMREL,boolGadget,NIL,NIL,NIL,0,NIL,2,NIL);
  59.     BRControl01 :   Gadget = (NIL,0,0,0,0, gadghComp,
  60.                               GIMREL,boolGadget,NIL,NIL,NIL,0,NIL,1,NIL);
  61.  
  62.     brianimage      :   Image = (0,0,0,0,1,NIL,%1,0,NIL);
  63.  
  64.     brianfontattr   :   TextAttr = ("topaz.font",8,FS_NORMAL,FPF_ROMFONT);
  65.  
  66.     BrianTitle      :   String = "\0$VER: Brian V0.10 (06.05.95) © 1995 by Andreas Neumann";
  67.  
  68.     BrianMini       :   String = "Brian";
  69.  
  70.     MyNewBrianWindow    :   NewWindow = (0,0,0,0,-1,-1,
  71.                                          MOUSEBUTTONS_f+GADGETUP_f+RAWKEY_f+
  72.                                          GADGETDOWN_f+CLOSEWINDOW_f,
  73.                                          WINDOWDRAG+WINDOWDEPTH+
  74.                                          ACTIVATE +SMART_REFRESH+
  75.                                          WINDOWCLOSE+RMBTRAP,
  76.                                          NIL,NIL,NIL,NIL,NIL,0,0,0,0,
  77.                                          WBENCHSCREEN_f);
  78.  
  79.     MyNewMiniWindow     :   NewWindow = (0,0,0,0,-1,-1,
  80.                                          MOUSEBUTTONS_f+CLOSEWINDOW_f,
  81.                                          WINDOWDRAG+WINDOWDEPTH+
  82.                                          ACTIVATE+SMART_REFRESH+
  83.                                          WINDOWCLOSE+RMBTRAP,
  84.                                          NIL,NIL,NIL,NIL,NIL,0,0,0,0,
  85.                                          WBENCHSCREEN_f);
  86.  
  87.     StdInName   :   String  =   NIL;
  88.     StdOutName  :   String  =   NIL;
  89.  
  90.     brianwait   :   CHIP ARRAY [1..40] OF SHORT =
  91.                     ($0000,$0000,$0400,$07c0,$0000,$07c0,$0100,$0380,
  92.                      $0000,$07e0,$07c0,$1ff8,$1ff0,$3fec,$3ff8,$7fde,
  93.                      $3ff8,$7fbe,$7ffc,$ff7f,$7efc,$ffff,$7ffc,$ffff,
  94.                      $3ff8,$7ffe,$3ff8,$7ffe,$1ff0,$3ffc,$07c0,$1ff8,
  95.                      $0000,$07e0,$0000,$0000,$0000,$03f2,$0000,$0000);
  96.  
  97. TYPE
  98.  
  99.     BrianText   =   RECORD
  100.                         bt_prev,
  101.                         bt_next     :   ^briantext;
  102.                         bt_text     :   String;
  103.                     END;
  104.     BrianTextPtr    =   ^BrianText;
  105.  
  106.     Pointerfeld =   ARRAY [1..40] OF WORD;
  107.  
  108. VAR minwin,
  109.     outwin      :   WindowPtr;
  110.     WB          :   WBStartupPtr;
  111.     tname       :   String;
  112.     myibase     :   IntuitionBasePtr;
  113.     brianfont   :   TextFontPtr;
  114.     bscreen     :   ScreenPtr;
  115.     firstbrian,
  116.     actbrian    :   BrianTextPtr;
  117.     brianle,
  118.     briante,
  119.     briantop,
  120.     brianonside,
  121.     brianlines  :   INTEGER;
  122.     briancon    :   BOOLEAN;
  123.  
  124. PROCEDURE CFreeString (VAR str : String);
  125.  
  126. BEGIN
  127.  IF str<>NIL THEN FreeString (str);
  128.  str:=NIL;
  129. END;
  130.  
  131.  
  132. PROCEDURE MakeGadgetBorders (fg : GadgetPtr);
  133.  
  134. VAR ngadget : GadgetPtr;
  135.     bt, bs, bp : BorderPtr;
  136.     kt, ks, kp : ^ARRAY[0..5] OF SHORT;
  137.  
  138. BEGIN
  139.  ngadget:=fg;
  140.  REPEAT
  141.   IF (ngadget^.Flags AND GADGIMAGE)<>GADGIMAGE THEN
  142.   IF ngadget^.GadgetType=boolGadget THEN
  143.   IF ngadget^.userData=NIL THEN
  144.   BEGIN
  145.    kp:=AllocMem(SizeOf(Short)*6,MEMF_CLEAR+MEMF_PUBLIC);
  146.    bp:=AllocMem(SizeOf(Border),MEMF_CLEAR+MEMF_PUBLIC);
  147.  
  148.    bt:=AllocMem(SizeOf(Border),MEMF_CLEAR+MEMF_PUBLIC);
  149.    bs:=AllocMem(SizeOf(Border),MEMF_CLEAR+MEMF_PUBLIC);
  150.    kt:=AllocMem(SizeOf(Short)*6,MEMF_CLEAR+MEMF_PUBLIC);
  151.    ks:=AllocMem(SizeOf(Short)*6,MEMF_CLEAR+MEMF_PUBLIC);
  152.  
  153.    IF ks<>NIL THEN
  154.    BEGIN
  155.     WITH bt^ DO
  156.     BEGIN
  157.      FrontPen:=2;
  158.      BackPen:=1;
  159.      DrawMode:=JAM1;
  160.      Count:=3;
  161.     END;
  162.     WITH bs^ DO
  163.     BEGIN
  164.      FrontPen:=1;
  165.      BackPen:=2;
  166.      DrawMode:=JAM1;
  167.      Count:=3;
  168.     END;
  169.     WITH bp^ DO
  170.     BEGIN
  171.      FrontPen:=1;
  172.      BackPen:=2;
  173.      DrawMode:=JAM1;
  174.      Count:=3;
  175.     END;
  176.  
  177.     bt^.NextBorder:=bs;
  178.     bs^.NextBorder:=bp;
  179.  
  180.     bt^.XY:=kt;
  181.     bs^.XY:=ks;
  182.     bp^.XY:=kp;
  183.  
  184.     WITH ngadget^ DO
  185.     BEGIN
  186.      kt^[0]:=0; kt^[1]:=Height-1; kt^[2]:=0; kt^[3]:=0; kt^[4]:=Width-1; kt^[5]:=0;
  187.      ks^[0]:=Width-1; ks^[1]:=1; ks^[2]:=Width-1; ks^[3]:=Height-1; ks^[4]:=1; ks^[5]:=Height-1;
  188.  
  189.      IF GadgetID=2 THEN
  190.      BEGIN
  191.       kp^[0]:=2; kp^[1]:=Height-4; kp^[2]:=(Width DIV 2); kp^[3]:=2; kp^[4]:=Width-3; kp^[5]:=Height-4;
  192.      END
  193.      ELSE
  194.      BEGIN
  195.       kp^[0]:=2; kp^[1]:=2; kp^[2]:=(Width DIV 2); kp^[3]:=Height-4; kp^[4]:=Width-3; kp^[5]:=2;
  196.      END;
  197.  
  198.      GadgetRender:=bt;
  199.     END;
  200.  
  201.    END;
  202.   END;
  203.   ngadget:=ngadget^.NextGadget;
  204.  UNTIL (ngadget=NIL);
  205.  
  206. END;
  207.  
  208.  
  209. PROCEDURE FreeGadgetBorders (fg : GadgetPtr);
  210.  
  211. VAR ngadget : GadgetPtr;
  212.     bptr, bptr2 , bptr3 : BorderPtr;
  213.  
  214. BEGIN
  215.  ngadget:=fg;
  216.  REPEAT
  217.   IF (ngadget^.Flags AND GADGIMAGE)<>GADGIMAGE THEN
  218.   IF ngadget^.GadgetType=boolGadget THEN
  219.   IF ngadget^.userData=NIL THEN
  220.   BEGIN
  221.    bptr:=ngadget^.GadgetRender;
  222.    IF bptr<>NIL THEN
  223.    BEGIN
  224.     IF bptr^.XY<>NIL THEN FreeMem (bptr^.XY,SizeOf(Short)*6);
  225.     bptr2:=bptr^.NextBorder;
  226.     IF bptr2<>NIL THEN
  227.     BEGIN
  228.      IF bptr2^.XY<>NIL THEN FreeMem (bptr2^.XY,SizeOf(Short)*6);
  229.      bptr3:=bptr2^.NextBorder;
  230.      IF bptr3<>NIL THEN
  231.      BEGIN
  232.       IF bptr3^.XY<>NIL THEN FreeMem (bptr3^.XY,SizeOf(Short)*6);
  233.       FreeMem (bptr3,SizeOf(Border));
  234.      END;
  235.      FreeMem (bptr2,SizeOf(Border));
  236.     END;
  237.     FreeMem(bptr,SizeOf(Border));
  238.     ngadget^.GadgetRender:=NIL;
  239.    END;
  240.   END;
  241.   ngadget:=ngadget^.NextGadget;
  242.  UNTIL (ngadget=NIL);
  243.  
  244. END;
  245.  
  246.  
  247. FUNCTION w2i (sh : SHORT) : INTEGER;
  248.  
  249. BEGIN
  250.  IF sh<0 THEN
  251.   w2i:=sh+65536
  252.  ELSE
  253.   w2i:=sh;
  254. END;
  255.  
  256. FUNCTION i2w (inte : INTEGER) : SHORT;
  257.  
  258. VAR inti : INTEGER;
  259.  
  260. BEGIN
  261.  inti:=inte-65536;
  262.  IF inti<0 THEN
  263.   i2w:=inti
  264.  ELSE
  265.   i2w:=inte;
  266. END;
  267.  
  268. PROCEDURE AdjustPropGadget (win : WindowPtr; gad : GadgetPtr ; pro : PropInfoPtr ; pos , maxpos : INTEGER);
  269.  
  270. VAR fl, hp , vp , hb , vb : INTEGER;
  271.     apfakt  :   REAL;
  272.  
  273. BEGIN
  274.  fl:=pro^.Flags;
  275.  
  276.  apfakt:=MYMAXPOT/maxpos;
  277.  vp:=ROUND(pos*apfakt);
  278.  
  279.  hp:=pro^.HorizPot;
  280.  
  281.  vb:=ROUND(MYMAXBODY/ maxpos);
  282.  
  283.  hb:=pro^.HorizBody;
  284.  
  285.  NewModifyProp (gad,win,NIL,fl, hp,i2w(vp),hb,i2w(vb),-1);
  286.  
  287. END;
  288.  
  289.  
  290. FUNCTION ReadOutProp (pro : PropInfoPtr ; maxpos : INTEGER) : INTEGER;
  291.  
  292. VAR
  293.     rop1,
  294.     rop2    :   REAL;
  295.  
  296. BEGIN
  297.  rop1:=MYMAXBODY/maxpos;
  298.  rop2:=w2i(pro^.VertPot)/rop1;
  299.  ReadOutProp:=ROUND(rop2);
  300. END;
  301.  
  302.  
  303. PROCEDURE AdProp;
  304.  
  305. BEGIN
  306.  IF brianlines>(brianonside+1) THEN
  307.   AdjustPropGadget (outwin,Adr(BRControl03),Adr(BRPropInfo),briantop-1,(brianlines-brianonside-1));
  308. END;
  309.  
  310.  
  311. PROCEDURE CloseOutDisplay;
  312.  
  313. BEGIN
  314.  IF outwin^.FirstGadget<>NIL THEN
  315.  BEGIN
  316.   IF RemoveGList (outwin,outwin^.FirstGadget,-1)=0 THEN ;
  317.   FreeGadgetBorders (Adr(BRControl01));
  318.  END;
  319.  CloseWindow (outwin);
  320.  outwin:=NIL;
  321. END;
  322.  
  323. PROCEDURE CloseMinDisplay;
  324.  
  325. BEGIN
  326.  CloseWindow (minwin);
  327.  minwin:=NIL;
  328. END;
  329.  
  330.  
  331. PROCEDURE CloseWork;
  332.  
  333. PROCEDURE CloseLibs;
  334.  
  335. BEGIN
  336.  IF DiskFontBase<>NIL THEN CloseLibrary (DiskFontBase);
  337.  IF PPBase<>NIL THEN CloseLibrary (PPBase);
  338.  IF GfxBase<>NIL THEN CloseLibrary (GfxBase);
  339. END;
  340.  
  341.  
  342. PROCEDURE FreeStrings;
  343.  
  344. BEGIN
  345.  CFreeString (tname);
  346. END;
  347.  
  348.  
  349. PROCEDURE FreeBrians;
  350.  
  351. VAR fb1,
  352.     fb2     :   BrianTextPtr;
  353.  
  354. BEGIN
  355.  fb1:=FirstBrian;
  356.  WHILE fb1<>NIL DO
  357.  BEGIN
  358.   fb2:=fb1^.bt_next;
  359.   IF fb1^.bt_text<>NIL THEN FreeString (fb1^.bt_text);
  360.   FreeMem (fb1,SizeOf(BrianText));
  361.   fb1:=fb2;
  362.  END;
  363.  FirstBrian:=NIL;
  364. END;
  365.  
  366. BEGIN
  367.  IF briancon THEN CloseConsoleDevice;
  368.  IF outwin<>NIL THEN
  369.   CloseOutDisplay;
  370.  IF minwin<>NIL THEN
  371.   CloseMinDisplay;
  372.  IF brianimage.ImageData<>NIL THEN
  373.   FreeMem (brianimage.ImageData,SIZEOF(SHORT)*(TRUNC((BRControl03.Width-1)/16)+1)*(bscreen^.Height-(3*brianfont^.tf_YSize)-16));
  374.  FreeBrians;
  375.  FreeStrings;
  376.  CloseLibs;
  377.  Exit;
  378. END;
  379.  
  380.  
  381.  
  382. PROCEDURE OpenOutDisplay;
  383.  
  384. PROCEDURE MacheGadgets;
  385.  
  386. VAR mg1,
  387.     mg2     :   INTEGER;
  388.  
  389. BEGIN
  390.  mg1:=TextLength(Adr(bscreen^.SRastPort),"W",1)+4;
  391.  IF mg1<12 THEN mg1:=12;
  392.  mg2:=TRUNC((mg1-1)/16);
  393.  Inc(mg2);
  394.  brianimage.ImageData:=AllocMem (SIZEOF(SHORT)*mg2*(bscreen^.Height-(3*brianfont^.tf_YSize)-16),MEMF_CHIP+MEMF_CLEAR);
  395.  IF brianimage.ImageData=NIL THEN CloseWork;
  396.  BRPropInfo.HorizBody:=MYMAXBODY;
  397.  BRPropInfo.HorizPot:=0;
  398.  BRPropInfo.VertBody:=MYMAXBODY;
  399.  BRPropInfo.VertPot:=0;
  400.  WITH BRControl03 DO
  401.  BEGIN
  402.   TopEdge:=brianfont^.tf_YSize+8;
  403.   LeftEdge:=bscreen^.Width-4-mg1;
  404.   Width:=mg1-3;
  405.   Height:=(bscreen^.Height-(3*brianfont^.tf_YSize)-16);
  406.   SpecialInfo:=Adr(BRPropInfo);
  407.   GadgetRender:=Adr(brianimage);
  408.  END;
  409.  WITH BRControl02 DO
  410.  BEGIN
  411.   TopEdge:=BRControl03.TopEdge+BRControl03.Height;
  412.   LeftEdge:=BRControl03.LeftEdge-1;
  413.   Width:=BRControl03.Width+2;
  414.   Height:=brianfont^.tf_YSize+2;
  415.   NextGadget:=Adr(BRControl03);
  416.  END;
  417.  WITH BRControl01 DO
  418.  BEGIN
  419.   TopEdge:=BRControl02.TopEdge+BRControl02.Height;
  420.   LeftEdge:=BRControl02.LeftEdge;
  421.   Width:=BRControl02.Width;
  422.   Height:=BRControl02.Height;
  423.   NextGadget:=Adr(BRControl02);
  424.  END;
  425.  MakeGadgetBorders (Adr(BRControl01));
  426.  MyNewBrianWindow.FirstGadget:=Adr(BRControl01);
  427. END;
  428.  
  429. PROCEDURE Line (w : WindowPtr; x1 , y1 , x2 , y2 , col : Short);
  430.  
  431. BEGIN
  432.  SetAPen (w^.RPort,col);
  433.  Move (w^.RPort,x1,y1);
  434.  Draw (w^.RPort,x2,y2);
  435. END;
  436.  
  437.  
  438. BEGIN
  439.  MacheGadgets;
  440.  outwin:=OpenWindow (Adr(MyNewBrianWindow));
  441.  IF outwin=NIL THEN CloseWork;
  442.  SetFont (outwin^.RPort,brianfont);
  443.  WITH BRControl03 DO
  444.  BEGIN
  445.   Line (outwin,LeftEdge-1,TopEdge-1,LeftEdge-1,TopEdge+Height,2);
  446.   Line (outwin,LeftEdge-1,TopEdge-1,LeftEdge+Width,TopEdge-1,2);
  447.   Line (outwin,LeftEdge+Width,TopEdge,LeftEdge+Width,TopEdge+Height,1);
  448.   Line (outwin,LeftEdge,TopEdge+Height,LeftEdge+Width,TopEdge+Height,1);
  449.  END;
  450. END;
  451.  
  452.  
  453. PROCEDURE OpenMinDisplay;
  454.  
  455. BEGIN
  456.  WITH MyNewMiniWindow DO
  457.  BEGIN
  458.   IF brianle>=0 THEN
  459.    LeftEdge:=brianle
  460.   ELSE
  461.    LeftEdge:=0;
  462.   IF briante>=0 THEN
  463.    TopEdge:=briante
  464.   ELSE
  465.    TopEdge:=0;
  466.  END;
  467.  minwin:=OpenWindow (Adr(MyNewMiniWindow));
  468.  IF minwin=NIL THEN CloseWork;
  469. END;
  470.  
  471.  
  472. FUNCTION CAllocString (size : INTEGER) : String;
  473.  
  474. VAR castr   :   String;
  475.  
  476. BEGIN
  477.  castr:=AllocString (size);
  478.  IF castr=NIL THEN CloseWork;
  479.  CAllocString:=castr;
  480. END;
  481.  
  482.  
  483. FUNCTION FileExists (fname : String) : BOOLEAN;
  484.  
  485. VAR flock   :   FileLock;
  486.     fres    :   BOOLEAN;
  487.  
  488. BEGIN
  489.  flock:=Lock(fname,ACCESS_READ);
  490.  IF flock<>NIL THEN
  491.  BEGIN
  492.   fres:=TRUE;
  493.   UnLock(flock);
  494.  END
  495.  ELSE
  496.   fres:=FALSE;
  497.  FileExists:=fres;
  498. END;
  499.  
  500.  
  501. FUNCTION GetActualFont (gb : ^GfxBaseRec) : TextFontPtr;
  502.  
  503. VAR garesult        :   TextFontPtr;
  504.     gat             :   TextAttrPtr;
  505.  
  506. BEGIN
  507.  garesult:=gb^.DefaultFont;
  508.  IF bscreen<>NIL THEN
  509.  BEGIN
  510.   gat:=bscreen^.Font;
  511.   IF gat<>NIL THEN
  512.   BEGIN
  513.    garesult:=NIL;
  514.    CopyMem (gat,Adr(brianfontattr),SizeOf(TextAttr));
  515.   END;
  516.  END;
  517.  GetActualFont:=garesult;
  518. END;
  519.  
  520.  
  521. PROCEDURE DisplayPageOfBrians;
  522.  
  523. VAR dp1,
  524.     dp2     :   INTEGER;
  525.     dpb     :   BrianTextPtr;
  526.  
  527. BEGIN
  528.  SetAPen (outwin^.RPort,0);
  529.  RectFill (outwin^.RPort,5,brianfont^.tf_YSize+8,BRControl02.LeftEdge-1,outwin^.Height-8);
  530.  dpb:=ActBrian;
  531.  SetAPen (outwin^.RPort,1);
  532.  SetDrMd (outwin^.RPort,JAM1);
  533.  FOR dp1:=1 TO brianonside DO
  534.  BEGIN
  535.   IF dpb<>NIL THEN
  536.   BEGIN
  537.    IF dpb^.bt_text<>NIL THEN
  538.    BEGIN
  539.     Move (outwin^.RPort,5,(brianfont^.tf_YSize+8)+((dp1-1)*brianfont^.tf_YSize)+brianfont^.tf_Baseline);
  540.     GText (outwin^.RPort,dpb^.bt_text,StrLen(dpb^.bt_text));
  541.    END;
  542.    dpb:=dpb^.bt_next;
  543.   END;
  544.  END;
  545.  AdProp;
  546. END;
  547.  
  548. PROCEDURE SetUpSystem;
  549.  
  550. PROCEDURE SetEverythingZero;
  551.  
  552. BEGIN
  553.  GfxBase:=NIL;
  554.  DiskFontBase:=NIL;
  555.  PPBase:=NIL;
  556.  outwin:=NIL;
  557.  minwin:=NIL;
  558.  tname:=NIL;
  559.  myibase:=NIL;
  560.  WB:=NIL;
  561.  brianfont:=NIL;
  562.  bscreen:=NIL;
  563.  firstbrian:=NIL;
  564.  actbrian:=NIL;
  565.  
  566.  brianlines:=0;
  567.  briancon:=FALSE;
  568.  brianle:=-1;
  569.  briante:=-1;
  570. END;
  571.  
  572.  
  573. PROCEDURE OpenLibs;
  574.  
  575. CONST
  576.         gfxname         : String = "graphics.library";
  577.         diskfontname    : String = "diskfont.library";
  578.         intuitionname   : String = "intuition.library";
  579.  
  580. BEGIN
  581.  GfxBase:=OpenLibrary(gfxname , 0);
  582.  IF GfxBase=NIL THEN CloseWork;
  583.  PPBase:=OpenLibrary (PPNAME,PPVERSION);
  584.  DiskFontBase:=OpenLibrary (diskfontname,0);
  585.  myibase:=Address(OpenLibrary (intuitionname,0));
  586.  IF myibase=NIL THEN CloseWork;
  587. END;
  588.  
  589. PROCEDURE AllocStrings;
  590.  
  591. BEGIN
  592.  tname:=CAllocString (255);
  593. END;
  594.  
  595.  
  596. PROCEDURE GetFont;
  597.  
  598. BEGIN
  599.  brianfont:=GetActualFont (GfxBase);
  600.  
  601.  IF DiskFontBase<>NIL THEN
  602.  BEGIN
  603.   IF brianfont=NIL THEN
  604.    brianfont:=OpenDiskFont (Adr(brianfontattr));
  605.  END;
  606.  
  607.  IF brianfont=NIL THEN
  608.   brianfont:=OpenFont (Adr(brianfontattr));
  609.  IF brianfont=NIL THEN
  610.   CloseWork;
  611. END;
  612.  
  613.  
  614. PROCEDURE GetBScreen;
  615.  
  616. BEGIN
  617.  bscreen:=myibase^.ActiveScreen;
  618.  IF bscreen=NIL THEN
  619.    bscreen:=myibase^.FirstScreen;
  620. END;
  621.  
  622. PROCEDURE MacheWindowGroesse;
  623.  
  624. BEGIN
  625.  IF bscreen<>NIL THEN
  626.  BEGIN
  627.   WITH MyNewBrianWindow DO
  628.   BEGIN
  629.    LeftEdge:=bscreen^.LeftEdge;
  630.    TopEdge:=bscreen^.TopEdge;
  631.    Width:=bscreen^.Width;
  632.    Height:=bscreen^.Height;
  633.    Title:=Address(Integer(BrianTitle)+7);
  634.    Screen:=bscreen;
  635.   END;
  636.   WITH MyNewMiniWindow DO
  637.   BEGIN
  638.    Width:=TextLength(Adr(bscreen^.SRastPort),BrianMini,StrLen(BrianMini))+100;
  639.    Height:=brianfont^.tf_YSize+3;
  640.    Title:=BrianMini;
  641.    Screen:=bscreen;
  642.   END;
  643.  END
  644.  ELSE
  645.   CloseWork;
  646. END;
  647.  
  648. PROCEDURE ReadText;
  649.  
  650. VAR rthandle    :   FileHandle;
  651.     rt1,
  652.     rt2         :   INTEGER;
  653.     rtbuffer    :   Address;
  654.  
  655.  
  656. PROCEDURE GetBrian;
  657.  
  658. VAR
  659.     gbold,
  660.     gbpointer   :   ^BYTE;
  661.     gbbrian     :   BrianTextPtr;
  662.     gblen       :   INTEGER;
  663.  
  664. PROCEDURE NewBrian (off : INTEGER);
  665.  
  666. VAR nb1,
  667.     nb2     :   BrianTextPtr;
  668.     nblen   :   INTEGER;
  669.  
  670. BEGIN
  671.  nb1:=AllocMem (SizeOf(BrianText),MEMF_CLEAR+MEMF_PUBLIC);
  672.  IF nb1<>NIL THEN
  673.  BEGIN
  674.   IF gbbrian=NIL THEN
  675.    FirstBrian:=nb1
  676.   ELSE
  677.    gbbrian^.bt_next:=nb1;
  678.   nb1^.bt_prev:=gbbrian;
  679.   Inc(brianlines);
  680.  
  681.   nblen:=Integer(gbpointer)-Integer(gbold)+off;
  682.   IF nblen>0 THEN
  683.   BEGIN
  684.    nb1^.bt_text:=AllocString (nblen+1);
  685.    IF nb1^.bt_text<>NIL THEN
  686.    BEGIN
  687.     StrNCpy (nb1^.bt_text,Address(gbold),nblen);
  688.    END;
  689.   END;
  690.  
  691.   gbold:=Address(Integer(gbpointer)+1+off);
  692.  
  693.   gblen:=0;
  694.   gbbrian:=nb1;
  695.  END;
  696. END;
  697.  
  698. BEGIN
  699.  IF rt1>0 THEN
  700.  BEGIN
  701.   gbpointer:=rtbuffer;
  702.   gbold:=gbpointer;
  703.   gbbrian:=NIL;
  704.   gblen:=0;
  705.   WHILE (Integer(gbpointer)<=(Integer(rtbuffer)+rt1-1)) DO
  706.   BEGIN
  707.    IF (gbpointer^=$0A) THEN
  708.     NewBrian (0)
  709.    ELSE
  710.     Inc(gblen,TextLength (outwin^.RPort,Address(gbpointer),1));
  711.    IF gblen>(BRControl02.LeftEdge-6) THEN
  712.    BEGIN
  713.     NewBrian (-1);
  714.     gbold:=Address(Integer(gbold)-1);
  715.     gblen:=TextLength(outwin^.RPort,Address(gbold),Integer(gbpointer)-Integer(gbold)+1);
  716.    END;
  717.    gbpointer:=Address(Integer(gbpointer)+1);
  718.   END;
  719.   IF Integer(gbold)<>(Integer(gbpointer)-1) THEN
  720.    NewBrian (-1);
  721.   FreeMem (rtbuffer,rt1);
  722.  END;
  723. END;
  724.  
  725. BEGIN
  726.  IF PPBase<>NIL THEN
  727.  BEGIN
  728.   rt2:=ppLoadData (tname,DECR_NONE,MEMF_CLEAR+MEMF_PUBLIC,Adr(rtbuffer),Adr(rt1),nil);
  729.   IF rtbuffer<>NIL THEN
  730.   BEGIN
  731.    GetBrian;
  732.   END;
  733.  END
  734.  ELSE
  735.  BEGIN
  736.   rthandle:=DOSOpen (tname,MODE_OLDFILE);
  737.   IF rthandle<>NIL THEN
  738.   BEGIN
  739.    rt1:=Seek(rthandle,0,OFFSET_END);
  740.    rt1:=Seek(rthandle,0,OFFSET_BEGINNING);
  741.    rtbuffer:=AllocMem (rt1,MEMF_CLEAR+MEMF_PUBLIC);
  742.    IF rtbuffer<>NIL THEN
  743.    BEGIN
  744.     rt2:=DOSRead (rthandle,rtbuffer,rt1);
  745.     DOSClose (rthandle);
  746.     GetBrian;
  747.    END;
  748.   END;
  749.  END;
  750. END;
  751.  
  752.  
  753.  
  754. BEGIN
  755.  SetEverythingZero;
  756.  OpenLibs;
  757.  AllocStrings;
  758.  
  759.  WB:=GetStartupMsg;
  760.  IF WB<>NIL THEN
  761.  BEGIN
  762.   IF CurrentDir (WB^.sm_ArgList^[1].wa_Lock)=NIL THEN ;
  763.   StrCpy (tname,WB^.sm_ArgList^[2].wa_Name);
  764.   IF CurrentDir (WB^.sm_ArgList^[2].wa_Lock)=NIL THEN ;
  765.  END
  766.  ELSE
  767.   GetParam (1,tname);
  768.  
  769.  IF StrLen(tname)<=1 THEN CloseWork;
  770.  IF FileExists (tname)=FALSE THEN CloseWork;
  771.  
  772.  GetBScreen;
  773.  GetFont;
  774.  
  775.  MacheWindowGroesse;
  776.  
  777.  OpenOutDisplay;
  778.  SetPointer(outwin,Adr(brianwait),16,16,-1,-1);
  779.  
  780.  ReadText;
  781.  ActBrian:=FirstBrian;
  782.  briantop:=1;
  783.  
  784.  IF brianfont^.tf_YSize>0 THEN
  785.   brianonside:=TRUNC ((outwin^.Height-16-brianfont^.tf_YSize)/brianfont^.tf_YSize)
  786.  ELSE
  787.   brianonside:=0;
  788.  
  789.  DisplayPageOfBrians;
  790.  
  791.  AdProp;
  792.  OpenConsoleDevice;
  793.  briancon:=TRUE;
  794.  ClearPointer (outwin);
  795. END;
  796.  
  797.  
  798. PROCEDURE HandleWork;
  799.  
  800. VAR himes   :   IntuiMessagePtr;
  801.     hwscroll,
  802.     hw1,
  803.     hw2,
  804.     hw3     :   INTEGER;
  805.     hwicon,
  806.     hwende  :   BOOLEAN;
  807.     hwbrian :   BrianTextPtr;
  808.     hwbuf   :   ARRAY [0..7] OF CHAR;
  809.  
  810. PROCEDURE ScrollPageUp;
  811.  
  812. VAR sp1 :   INTEGER;
  813.  
  814. BEGIN
  815.  FOR sp1:=1 TO brianonside DO
  816.  BEGIN
  817.   hwbrian:=ActBrian^.bt_prev;
  818.   IF hwbrian<>NIL THEN
  819.   BEGIN
  820.    ActBrian:=hwbrian;
  821.    Dec(briantop);
  822.   END;
  823.  END;
  824.  DisplayPageOfBrians;
  825. END;
  826.  
  827. PROCEDURE ScrollBrianUp;
  828.  
  829. BEGIN
  830.  ScrollRaster (outwin^.RPort,0,-brianfont^.tf_YSize,5,brianfont^.tf_YSize+8,BRControl02.LeftEdge-1,7+((brianonside+1)*brianfont^.tf_YSize));
  831.  SetAPen (outwin^.RPort,0);
  832.  RectFill (outwin^.RPort,5,brianfont^.tf_YSize+8,BRControl02.LeftEdge-1,(2*brianfont^.tf_YSize)+7);
  833.  ActBrian:=ActBrian^.bt_prev;
  834.  Dec(briantop);
  835.  SetAPen (outwin^.RPort,1);
  836.  SetDrMd (outwin^.RPort,JAM1);
  837.  IF ActBrian^.bt_text<>NIL THEN
  838.  BEGIN
  839.   Move (outwin^.RPort,5,(brianfont^.tf_YSize+8)+brianfont^.tf_Baseline);
  840.   GText (outwin^.RPort,ActBrian^.bt_text,StrLen(ActBrian^.bt_text));
  841.  END;
  842.  AdProp;
  843. END;
  844.  
  845.  
  846. PROCEDURE ScrollPageDown;
  847.  
  848. VAR sp1     :   INTEGER;
  849.     spbrian :   BrianTextPtr;
  850.  
  851. BEGIN
  852.  FOR sp1:=1 TO brianonside DO
  853.  BEGIN
  854.   hwbrian:=ActBrian^.bt_next;
  855.   IF hwbrian<>NIL THEN
  856.   BEGIN
  857.    ActBrian:=hwbrian;
  858.    Inc(briantop);
  859.   END;
  860.  END;
  861.  hwbrian:=ActBrian;
  862.  FOR sp1:=1 TO brianonside DO
  863.  BEGIN
  864.   IF hwbrian<>NIL THEN
  865.   BEGIN
  866.    spbrian:=hwbrian;
  867.    hwbrian:=hwbrian^.bt_next;
  868.   END;
  869.  END;
  870.  IF hwbrian=NIL THEN
  871.  BEGIN
  872.   FOR sp1:=1 TO brianonside DO
  873.    spbrian:=spbrian^.bt_prev;
  874.   IF spbrian=NIL THEN spbrian:=FirstBrian;
  875.   ActBrian:=spbrian;
  876.   briantop:=brianlines-brianonside;
  877.   IF briantop<1 THEN briantop:=1;
  878.  END;
  879.  DisplayPageOfBrians;
  880. END;
  881.  
  882. PROCEDURE ScrollBrianDown;
  883.  
  884. VAR sb1 :   INTEGER;
  885.  
  886. BEGIN
  887.  ScrollRaster (outwin^.RPort,0,brianfont^.tf_YSize,5,brianfont^.tf_YSize+8,BRControl02.LeftEdge-1,8+((brianonside+1)*brianfont^.tf_YSize));
  888.  SetAPen (outwin^.RPort,0);
  889.  RectFill (outwin^.RPort,5,brianfont^.tf_YSize+8+((brianonside-1)*brianfont^.tf_YSize),BRControl02.LeftEdge-1,outwin^.Height-8);
  890.  ActBrian:=ActBrian^.bt_next;
  891.  Inc(briantop);
  892.  SetAPen (outwin^.RPort,1);
  893.  SetDrMd (outwin^.RPort,JAM1);
  894.  hwbrian:=ActBrian;
  895.  FOR sb1:=1 TO (brianonside-1) DO
  896.   IF hwbrian<>NIL THEN hwbrian:=hwbrian^.bt_next;
  897.  IF hwbrian<>NIL THEN
  898.  IF hwbrian^.bt_text<>NIL THEN
  899.  BEGIN
  900.   Move (outwin^.RPort,5,(brianfont^.tf_YSize+8)+((brianonside-1)*brianfont^.tf_YSize)+brianfont^.tf_Baseline);
  901.   GText (outwin^.RPort,hwbrian^.bt_text,StrLen(hwbrian^.bt_text));
  902.  END;
  903.  AdProp;
  904. END;
  905.  
  906.  
  907. FUNCTION GetGadgetID (iadr : GadgetPtr) : Short;
  908.  
  909. BEGIN
  910.  GetGadgetID:=iadr^.GadgetID;
  911. END;
  912.  
  913.  
  914. PROCEDURE TickleItDown;
  915.  
  916. BEGIN
  917.  hwbrian:=ActBrian;
  918.  FOR hw1:=1 TO (brianonside+1) DO
  919.   IF hwbrian<>NIL THEN hwbrian:=hwbrian^.bt_next;
  920. END;
  921.  
  922.  
  923. PROCEDURE SimplyDown;
  924.  
  925. BEGIN
  926.  TickleItDown;
  927.  IF hwbrian<>NIL THEN
  928.   ScrollBrianDown;
  929. END;
  930.  
  931.  
  932. PROCEDURE Iconify;
  933.  
  934. VAR icmes   :   IntuiMessagePtr;
  935.     ic1,
  936.     ic2     :   INTEGER;
  937.  
  938. BEGIN
  939.  CloseOutDisplay;
  940.  OpenMinDisplay;
  941.  REPEAT
  942.   ic1:=0;
  943.   WaitPort (minwin^.UserPort);
  944.   icmes:=Address(GetMsg (minwin^.UserPort));
  945.   IF icmes<>NIL THEN
  946.   BEGIN
  947.    ic1:=icmes^.Class;
  948.    ic2:=icmes^.Code;
  949.    ReplyMsg (Address(icmes));
  950.   END;
  951.  UNTIL (ic1=CLOSEWINDOW_f) OR ((ic1=MOUSEBUTTONS_f) AND (ic2=MENUUP));
  952.  brianle:=minwin^.LeftEdge;
  953.  briante:=minwin^.TopEdge;
  954.  CloseMinDisplay;
  955.  IF ic1=MOUSEBUTTONS_f THEN
  956.  BEGIN
  957.   OpenOutDisplay;
  958.   DisplayPageOfBrians;
  959.   AdProp;
  960.  END
  961.  ELSE
  962.   hwende:=TRUE;
  963. END;
  964.  
  965.  
  966. PROCEDURE GoToTheTop;
  967.  
  968. BEGIN
  969.  IF ActBrian<>FirstBrian THEN
  970.  BEGIN
  971.   ActBrian:=FirstBrian;
  972.   briantop:=1;
  973.   DisplayPageOfBrians;
  974.  END;
  975. END;
  976.  
  977.  
  978. PROCEDURE GoToTheBottom;
  979.  
  980. BEGIN
  981.  TickleItDown;
  982.  IF hwbrian<>NIL THEN
  983.  BEGIN
  984.   WHILE hwbrian^.bt_next<>NIL DO
  985.    hwbrian:=hwbrian^.bt_next;
  986.   FOR hw1:=1 TO brianonside DO
  987.   IF hwbrian<>NIL THEN
  988.    hwbrian:=hwbrian^.bt_prev;
  989.   IF hwbrian=NIL THEN hwbrian:=FirstBrian;
  990.   ActBrian:=hwbrian;
  991.   briantop:=brianlines-brianonside;
  992.   IF briantop<1 THEN briantop:=1;
  993.   DisplayPageOfBrians;
  994.  END;
  995. END;
  996.  
  997.  
  998. BEGIN
  999.  hwende:=FALSE;
  1000.  hwicon:=FALSE;
  1001.  hwscroll:=0;
  1002.  REPEAT
  1003.   CASE hwscroll OF
  1004.    -1 : BEGIN
  1005.          IF ActBrian^.bt_prev<>NIL THEN
  1006.           ScrollBrianUp;
  1007.          AdProp;
  1008.         END;
  1009.     1 : BEGIN
  1010.          TickleItDown;
  1011.          IF hwbrian<>NIL THEN
  1012.           ScrollBrianDown;
  1013.         END;
  1014.    ELSE ;
  1015.   END;
  1016.   himes:=Address(GetMsg (outwin^.UserPort));
  1017.   IF brianlines>(brianonside+1) THEN
  1018.    hw1:=ReadOutProp(Adr(BRPropInfo),(brianlines-brianonside-1))+1
  1019.   ELSE
  1020.    hw1:=briantop;
  1021.   IF briantop<>hw1 THEN
  1022.   BEGIN
  1023.    ActBrian:=FirstBrian;
  1024.    briantop:=1;
  1025.    WHILE hw1>1 DO
  1026.    BEGIN
  1027.     IF ActBrian<>NIL THEN ActBrian:=ActBrian^.bt_next;
  1028.     Inc(briantop);
  1029.     Dec(hw1);
  1030.    END;
  1031.    DisplayPageOfBrians;
  1032.   END;
  1033.   IF himes<>NIL THEN
  1034.   BEGIN
  1035.    IF himes^.Class=MOUSEBUTTONS_f THEN IF himes^.Code=MENUUP THEN hwicon:=TRUE;
  1036.    IF himes^.Class=CLOSEWINDOW_f THEN hwende:=TRUE;
  1037.    IF himes^.Class=GADGETDOWN_f THEN
  1038.    BEGIN
  1039.     CASE GetGadgetID(himes^.IAddress) OF
  1040.      1 : hwscroll:=1;
  1041.      2 : hwscroll:=-1;
  1042.      ELSE hwscroll:=0;
  1043.     END;
  1044.    END
  1045.    ELSE
  1046.     hwscroll:=0;
  1047.  
  1048.    IF himes^.Class=RAWKEY_F THEN
  1049.    BEGIN
  1050.     hw1:=DeadKeyConvert (himes,Adr(hwbuf),6,NIL);
  1051.     IF hw1<=0 THEN
  1052.      hwbuf[0]:=CHR(0);
  1053.  
  1054.     CASE ToUpper(hwbuf[0]) OF
  1055.      'Q',
  1056.      'E'    :   hwende:=TRUE;
  1057.      ' '    :   SimplyDown;
  1058.      'T'    :   GoToTheTop;
  1059.      'B'    :   GoToTheBottom;
  1060.      ELSE   ;
  1061.     END;
  1062.  
  1063.     CASE himes^.Code OF
  1064.      ESC_RAW    :   hwende:=TRUE;
  1065.      CURSORUP   :   BEGIN
  1066.                      IF ActBrian^.bt_prev<>NIL THEN
  1067.                      BEGIN
  1068.                       IF (himes^.Qualifier AND (IEQUALIFIER_LSHIFT OR IEQUALIFIER_RSHIFT))>0 THEN
  1069.                        ScrollPageUp
  1070.                       ELSE
  1071.                        ScrollBrianUp;
  1072.                      END;
  1073.                     END;
  1074.      CURSORDOWN :   BEGIN
  1075.                          TickleItDown;
  1076.                          IF hwbrian<>NIL THEN
  1077.                          BEGIN
  1078.                           IF (himes^.Qualifier AND (IEQUALIFIER_LSHIFT OR IEQUALIFIER_RSHIFT))>0 THEN
  1079.                            ScrollPageDown
  1080.                           ELSE
  1081.                            ScrollBrianDown;
  1082.                          END;
  1083.                         END;
  1084.      HOME_RAW   :   GoToTheTop;
  1085.      END_RAW    :   GoToTheBottom;
  1086.      PGUP_RAW   :   IF ActBrian^.bt_prev<>NIL THEN
  1087.                      ScrollPageUp;
  1088.      PGDN_RAW   :   BEGIN
  1089.                      TickleItDown;
  1090.                      IF hwbrian<>NIL THEN
  1091.                       ScrollPageDown
  1092.                     END;
  1093.      RETURN_RAW,
  1094.      ENTER_RAW  :   SimplyDown;
  1095.      ELSE ;
  1096.     END;
  1097.  
  1098.  
  1099.    END;
  1100.    ReplyMsg (Address(himes));
  1101.  
  1102.   END;
  1103.  
  1104.   IF hwicon THEN
  1105.   BEGIN
  1106.    Iconify;
  1107.    hwicon:=FALSE;
  1108.   END;
  1109.  
  1110.  UNTIL hwende;
  1111. END;
  1112.  
  1113. BEGIN
  1114.  SetUpSystem;
  1115.  HandleWork;
  1116.  CloseWork;
  1117. END.
  1118.